package com.xinmachong.jwt_demo.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.Date;
import java.util.Map;

/**
 * @Author meyer@HongYe
 */
@Component
public class JWTUtils {

    @Value("${myDefine.jwt-token-expire}")
    private Integer initJwtTokenExpire;
    private static Integer jwtTokenExpire;

    private static final String SIGNATURE = "Xinmachong";

    //@PostConstruct 意思就是在完成构造函数实例化后就调用该方法，该方法会对 TokenPropertiesBO 对象实例化。
    @PostConstruct
    public void init(){
        jwtTokenExpire = initJwtTokenExpire;
    }

    /**
     * 生成token
     * @param map token将要携带的参数
     * @return 返回token
     */
    public static String getToken(Map<String,String> map){
        Date deadLine = new Date(System.currentTimeMillis() + jwtTokenExpire * 1000);
        Algorithm algorithm = Algorithm.HMAC256(SIGNATURE);
        // 创建JWT builder
        JWTCreator.Builder builder = JWT.create();
        // 生成payload
        map.forEach(builder::withClaim);
        return builder
                .withExpiresAt(deadLine) // 设置JWT 到期时间
                .sign(algorithm);        // 使用给定的算法对JWT 进行标记
    }


    /**
     * 验证token是否正确
     * @param token token信息
     * @return 返回校验结果
     */
    public static DecodedJWT verify(String token){
        return JWT.require(Algorithm.HMAC256(SIGNATURE)).build().verify(token);
    }


    /**
     * 获取token中的信息--例如通过本方法获取username
     * @param token token信息
     * @return 返回获取的信息结果
     */
    public static String getUsername(String token) {
        try {
            DecodedJWT jwt = JWT.decode(token);
            return jwt.getClaim("username").asString();
        }catch (JWTDecodeException e){
            return null;
        }
    }
}
